package com.foreknow.demo9;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * 异常(Exception)
 * 1. 所有异常的根父类是Throwable
 * 2. Throwable有两个直接的子类：Error(错误)   Exception(异常)   我们主要处理的就是Exception
 *
 * 异常按照处理方式可以分为如下两种类型：
 * 1．检查性异常（checked exception）
 * 若系统运行时可能产生该类异常，则必须写出相应的处理代码，否则无法通过编译。
 * 2．非检查性异常（unchecked exception）
 * 非检查性异常也称之为RuntimeException，若系统运行时可能产生该类异常，则不必在程序中声明对该类异常的处理，就可以编译执行。
 *
 * 如何处理异常：try......catch
 * 语法：
 *         try {
 *             // 有可能出现异常的代码
 *
 *         }catch (Exception e){
 *             // 处理异常
 *         }
 *  throws：表示抛出异常(异常的声明)，通常这个关键字写到方法的后面
 *  语法：public void m1() throws 异常类型{
 *
 *       }
 *  它可以表示为当前的方法中有可能会产生异常，但是在这个方法中我们不去处理，谁调用这个方法谁来处理
 *  throw：明确抛出异常
 */
public class ExceptionDemo {

    public static void m1() throws Exception{
        System.out.println("throws Exception");
    }

    public static void main(String[] args) {
        try {
            // 有可能出现异常的代码
            int[] arr = {1,2,3,4,5,6};
            for (int i = 0; i <= arr.length; i++) {
                System.out.println(arr[i]);
            }
        }catch (Exception e){
            // 处理异常
            System.out.println(e);
        }finally {
            // 无论try块中有没异常最终都会执行finally块中的代码
            System.out.println("finally......");
        }

        // 一个try后面可以有多个catch，catch中的错误类型规则为由小(子类型)到大类型
        try {
            Class.forName("");
            DriverManager.getConnection("");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        try {
            m1();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
